package main

import (
	"net/http"
	"os"
	"os/signal"
	"server/api"
	"server/db"
	"syscall"

	"gitee.com/MM-Q/fastlog"
)

func main() {
	// 初始化日志
	cfg := fastlog.NewCfg("logs", "server.log")
	cfg.LogLevel = fastlog.DEBUG
	log := fastlog.NewFLog(cfg)

	// 初始化数据库
	dbConnect, err := db.NewDB("db.db")
	if err != nil {
		log.Errorf("db.NewDB err: %v\n", err)
		return
	}

	// 设置优雅退出, 监听ctrl+c
	go func() {
		// 创建一个接收系统信号的通道，缓冲区大小为1
		sigs := make(chan os.Signal, 1)

		// 注册监听中断信号(SIGINT, 对应Ctrl+C)和终止信号(SIGTERM)
		signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

		// 阻塞等待信号到来
		<-sigs

		// 接收到信号后执行清理操作
		log.Debug("http server exited...")

		// 关闭数据库连接
		dbConnect.Close()

		// 关闭日志
		log.Close()

		os.Exit(0)
	}()

	// 首先需要初始化API实例（需要数据库连接）
	apiInstance := &api.API{DB: dbConnect}

	// 然后注册路由
	http.Handle("/register", fastlog.LogRequest(log, http.HandlerFunc(apiInstance.HandlerRegister)))

	// 注册路由
	http.Handle("/", fastlog.LogRequest(log, http.HandlerFunc(api.HandlerHelp)))
	http.Handle("/hello", fastlog.LogRequest(log, http.HandlerFunc(api.HandlerUser)))
	http.Handle("/hello/", fastlog.LogRequest(log, http.HandlerFunc(api.HandlerUser)))

	// 监听端口
	log.DebugFields("listening on",
		fastlog.String("ip", "127.0.0.1"),
		fastlog.String("port", "8080"),
	)
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Errorf("http.ListenAndServe err: %v\n", err)
		return
	}
}
